知识点名称:Activity之间传值

编号: K3-6

前驱知识点编号:K3-1,K3-2,K3-5

作者:

讲义内容:

前面我们介绍过在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象可以精确的指定要跳转到的Activity上,同时可以通过intent来携带一些值,进而完成Activity在跳转的时候把值传过去。

另外一些情况下,我们通过 Aactivity跳转到 Bactivity上,这时希望 Aactivtiy能从Bactivity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。这样的场景在实际开发中还是很常见的,比如说Aactivity中做了一个查询的功能,查询向后台请求数据,假设需要传入一个时间字段,不传的话默认是当前时间,Bactivity中可以设置时间,那我们就可以在Bactivity中设置时间,并根据Bactivity传回来的时间,在

Aactivity中就会有不同的查询结果。

因此,Activity之间有两种传值方式,一种是使用startActivity方法,在页面跳转时,将值从一个Activity传入另一个;另外一种是使用startActivityForResult方法,将值从跳转到的目标页面带回来。下面,我们就两种方式给出详细介绍。
  1. 通过startActivity来进行Activity的传值

使用Intent传递数据只需调用putExtra()方法将想要存储的数据存在Intent中即可。当启动了另一个Activity后,再把这些数据从Intent中取出即可。

在Aactivity中将数据存储在Intent中

String data = " welcome to Bactivity "
Intent intent = new Intent(this,Bactivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);

从Bactivity中取出传递过来的数据

Intent intent = getIntent();
String data  = intent.getStringExtra("extra_data");
Log.i("Bactivity ", data);

还有一种传递数据的方式是调用putExtras()方法传递数据,该方法传递的是Bundle对象,相当于将传递的数据封装在一个Bundle对象中。调用putExtras()方法传递数据可以使用如下代码:

Bundle bundle = new Bundle();

bundle.putString("name", "Linda");

bundle.putInt("age", 20);

Intent intent = new Intent(this,Bactivity.class);

intent.putExtras(bundle);

startActivity(intent);

如果想要在Bactivity中取出上述方式传递的数据,可以使用如下代码:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String stuName = bundle.getString("name");
int stuAge = bundle.getString("age");

下面我们通过一个实例来演示,设置一个登录界面Login,将登录名和密码传入一个新的界面Welcome。

登录界面的布局文件设置如下:

<EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />
      <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword" />
<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
               android:text="登录"/>

登录界面Login中代码如下:

private EditText tName,tPassword;
    private Button b;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        tName=(EditText) this.findViewById(R.id.editText1);
        tPassword=(EditText) this.findViewById(R.id.editText2);
        b=(Button) this.findViewById(R.id.button1);
        //点击按钮获取用户名和密码,并跳转到Welcome界面
        b.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                Intent intent=new Intent(Login.this,Welcome.class);
                Bundle bundle=new Bundle();
                bundle.putString("name", tName.getText().toString());
                bundle.putString("password", tPassword.getText().toString());
                intent.putExtras(bundle);
                Login.this.startActivity(intent);
            }
        });
    }

在Welcome界面获取传入的数据,代码如下:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.welcome);
        Intent intent=this.getIntent();
        Bundle bundle=intent.getExtras();
        String name=bundle.getString("name");
        TextView tView=(TextView) this.findViewById(R.id.textView1);
        tView.setText("name="+name+",password="+password);    }

如果输入的用户名是zhangsan,密码是110,我们来看接收到的数据显示:

以上实例展示了页面传值的情况,接下来我们看如何将数据回传。

2通过startActivityForResult回传数据

我们有时在使用微信发送图片时,通常会调到图库里面选择好要发送的图片,然后回到微信界面会看到刚选到的图片,其实这种效果是通过Andorid中的startActivityForResult()方法实现的。

startActivityForResult()示例代码如下:
Intent intent = new Intent(this,Bactivity.class);
startActivityForResult(intent,1);

在Bactivity中添加数据返回的示例代码,具体如下所示:

Intent intent = new Intent();
intent.putExtra("extra_data","Hello Activity");
setResult(1,intent);
finish();

由于使用了startActivityForResult()方法启动Aactivity,因此会在Aactiivity页面回调onActivityResult()方法,需要在Aactiivity中重写该方法来获取返回的数据,有的Activity对象的返回值都是由这个方法来接收,因此代码如下:

protected void onActivityResult(int requestCode, int resultCode,
 Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
         String data = data.getStringExtra("extra_data");
         Log.i("Aactivity",data);
    }
}

方法中的参数说明:

  • requestCode: If >= 0, this code will be returned in onActivityResult() when the activity exits.
  • requestCode :表示的是启动一个Activity时传过去的requestCode值
  • resultCode :表示的是启动后的Activity回传值时的resultCode值
  • data :表示的是启动后的Activity回传过来的Intent对象

下面我们以一个具体的实例来演示数据的回传,主界面SourceActiviy向目标界面TargetActivity传递需要计算的数据和运算符,目标界面TargetActivity计算并返回计算结果,在主界面SourceActiviy中显示结果,规定只能进行加减乘除的运算。

主界面SourceActiviy的布局文件包括三个文本框用来输入需要计算的数字和运算符,点击计算按钮,以消息的形式显示计算结果,布局文件代码如下:

 <EditText

android:id="@+id/editText1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:ems="10" >

</EditText>

<EditText

android:id="@+id/editText2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:ems="10" /

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="计算" />

主界面SourceActiviy传值部分的代码如下:

private EditText num1,num2;
    private Button b;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        num1=(EditText) this.findViewById(R.id.editText1);
        num2=(EditText) this.findViewById(R.id.editText2);
        b=(Button) this.findViewById(R.id.button1);
        //点击按钮获取获取运算数据和运算符,传入目标界面
        b.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                Intent intent=new Intent(Login.this,TargetActivity.class);
                Bundle bundle=new Bundle();
                String n1=num1.getText().toString();
                String n2=num2.getText().toString();
                bundle.putString("num1",n1 );
                bundle.putString("num2", n2);
                intent.putExtras(bundle);
                Login.this.startActivityForResult(intent,1);
            }
        });
    }

目标界面TargetActivity接收数据并计算且回传的代码如下:

public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.target); 
         Intent intent=this.getIntent();
         Bundle bundle=intent.getExtras();
         int n1=Integer.parseInt(bundle.getString("num1"));
         int n2=Integer.parseInt(bundle.getString("num2"));
         int result=n1+n2;
         intent=new Intent();
         intent.putExtra("result", result);
         this.setResult(1, intent);
         finish();
}
主界面SourceActiviy接收回传过来的代码如下:
protected void onActivityResult(int requestCode, int resultCode,
     Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
         if (resultCode == 1) {
        String result=data.getStringExtra("result");
Toast.makeText(this,"回传计算结果是:"+ result, Toast.LENGTH_SHORT).show();
                }    }
}

我们来看一下运行结果,主界面输入的数据如下:

点击计算按钮后的结果如下:

以上实例详细展示了Activity之间的数据回传。

至此,本章我们详细讲解了有关Activity的创建与启动、生命周期以及它们之间进行数据传递的知识。

results matching ""

    No results matching ""